******************************************************* * * * APPLE ][ * * * * TERMINAL SIMULATION * * * * ASYNCHR RS232 INPUT/OUTPUT ROUTINES * * * * COMPUTER BULLETIN 1981 * ******************************************************* ; DEFINES ORG $2000 ; APPLE ZERO PAGE USE CH * $0024 ; RELATIVE CURSOR POSITION BASL * $0028 ; BASE ADDRESS SCREEN BAUD * $00FB ; BAUD RATE CONSTANT CHAR * $00FE ; DATAFIELD ; APPLE I/O ADRESSES KB * $C000 ; KEYBOARD INPUT KBSTR * $C010 ; KEYBOARD STROBE MARK * $C058 ; GAME AN0 FLIP FLOP SET SPACE * $C059 ; GAME AN0 FLIP FLOP RESET PDLSW * $C061 ; GAME SW0 INPUT IN BIT 7 ; APPLE MONITOR USE BS * $FC10 ; NON DESTROYING BACKSPACE VIDOUT * $FDF0 ; PRINT CHARACTER IN A ON SCREEN ; MAIN ROUTINE ; TERMINAL SIMULATION ROUTINE TERSIM LDY CH ; BEGIN * TERMINAL SIMULATION * LDAIY BASL ; REPEAT PHA ; SHOW CURSOR POSITION ANDIM $3F ; IF KEY PRESSED THEN STAIY BASL ; REMOVE CURSOR FROM SCREEN TEST BIT KB ; CHARACTER := KEYCODE BMI KEYIN ; OUTPUT (CHARACTER) BIT PDLSW ; SHOW (CHARACTER) BMI TEST ; ENDIF PLA ; IF CHARACTER AT INPUT THEN STAIY BASL ; REMOVE CURSOR FROM SCREEN JSR INPUT ; INPUT (CHARACTER) JSR SHOW ; SHOW (CHARACTER) JMP TERSIM ; ENDIF KEYIN STAIY BASL ; UNTIL FOREVER LDA KB ; END * TERMINAL SIMULATION * BIT KBSTR ; JSR SHOW ; JSR OUTPUT ; JMP TERSIM ; ; SHOW CHARACTER ON APPLE SCREEN ROUTINE SHOW CMPIM $8A ; BEGIN * SHOW CHARACTER ON SCREEN * BNE BACKSP ; LDYIM $00 ; IF CHARACTER = LINEFEED THEN STY CH ; COLUMNPOSITION := 0 JMP VIDOUT ; SEND (LINEFEED) BACKSP CMPIM $88 ; ENDIF BNE CARRET ; IF CHARACTER = BACKSPACE THEN PHA ; * MAKE IT DESTROYING BACKSPACE * JSR BS ; SEND (BACKSPACE) LDAIM $A0 ; SEND (SPACE) JSR VIDOUT ; SEND (BACKSPACE) PLA ; ENDIF JMP VIDOUT ; IF CHARACTER = CARRIAGE RETURN THEN CARRET CMPIM $8D ; COLUMNPOSITION := 0 BNE ESC ; ENDIF LDAIM $00 ; IF CHARACTER = ESCAPE THEN STA CH ; * COMPLETE ESCAPE FROM TERMINAL SIMULATION * RTS ; EXIT ESC CMPIM $9B ; ENDIF BEQ EXIT ; IF CHARACTER = NORMAL THEN JMP VIDOUT ; SEND (CHARACTER) EXIT PLA ; ENDIF PLA ; END * SHOW CHARACTER ON SCREEN * RTS ; ; INPUT CHARACTER FROM GAME SW0 ROUTINE INPUT TXA ; BEGIN * INPUT CHARACTER * PHA ; * READ CHARACTER FROM AN0 ASYNCHR * TYA ; * AN0 = BIT 7 $C061 * PHA ; LDYIM $08 ; BITCOUNT := 8 IN BIT PDLSW ; WHILE NOT STARTBIT DO TEST FOR STARTBIT BMI IN ; DELAY BITTIME JSR DELAY ; DELAY HALF BITTIME JSR DEHALF ; WHILE BITCOUNT > 0 DO INP LDA PDLSW ; READ BIT ANDIM $80 ; SHIFT BIT IN CHARACTER LSR CHAR ; BITCOUNT := BITCOUNT - 1 ORA CHAR ; ENDWHILE STA CHAR ; DELAY BITTIME DEY ; SET MSB OF CHARACTER BNE INP ; * FOR APPLE VIDEO ROUTINE * JSR DELAY ; END * INPUT CHARACTER PLA ; TAY ; PLA ; TAX ; ORAIM $80 ; RTS ; ; OUTPUT CHARACTER TROUGH GAME AN0 OUTPUT PHA ; BEGIN * OUTPUT CHARACTER * TYA ; * SEND CHARACTER ASYNCHR TROUGH AN0 * PHA ; * AN0 FLIPFLOP OUTPUT C058 C059 * TXA ; * 1 STARTBIT , 8 DATABITS , 2 STOP * PHA ; TSX ; CARRY := STARTBIT LDAAX $0103 ; BITCOUNT := 11 LDYIM $0B ; WHILE BITCOUNT > 0 DO CLC ; OUTPUT := CARRY OUT PHA ; DELAY BITTIME BCS MRKOUT ; CARRY := STOPBIT LDA SPACE ; SHIFT CHARACTER RIGHT BCC WAIT ; LSB CHAR := CARRY MRKOUT LDA MARK ; CARRY := MSB CHAR WAIT JSR DELAY ; ENDWHILE PLA ; SEC ; END * OUTPUT CHARACTER * RORA ; DEY ; BNE OUT ; PLA ; TAX ; PLA ; TAY ; PLA ; RTS ; ; DELAY BITTIME ROUTINE DELAY LDY BAUD ; BEGIN * DELAY BITTIME * XD DEX ; DELAY (BAUD)*5 + 1 MICROSEC BNE XD ; END * DELAY BITTIME * RTS ; ; DELAY HALF BIT TIME ROUTINE DEHALF LDA BAUD ; BEGIN * DELAY HALF BITTIME * LSRA ; DELAY (BAUD/2)*5 + 6 MICROSEC TAX ; END * DELAY HALF BITTIME * XDH DEX ; BNE XDH ; RTS ;